package br.com.jw.jdbc;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.ResourceBundle;
import java.util.concurrent.ArrayBlockingQueue;

public class Pool {
	private Conexao conexao;
    private ArrayBlockingQueue<Connection> conexoesLivres;
    private HashMap<String, Connection> conexoesUtilizadas;
    private Integer numeroMaximoConexoes;
    private ResourceBundle config;
   
    public Pool(){        
        config = ResourceBundle.getBundle("br.com.jw.jdbc.bancodedados");
        conexao= new Conexao(config.getString("url"),config.getString("driver"),config.getString("usu_login"),config.getString("usu_senha"));
        numeroMaximoConexoes = Integer.parseInt(config.getString("numeroMaximoConexoes"));
        conexoesLivres = new ArrayBlockingQueue<Connection>(numeroMaximoConexoes,true);
        conexoesUtilizadas = new HashMap<String,Connection>();
    }
    public Connection getConnection() throws ClassNotFoundException, SQLException{
         Connection con = null;
        try{
        if(conexoesUtilizadas.size()< numeroMaximoConexoes){
            //metodo poll remove conexao da fila(conexoesLivres).
           con = conexoesLivres.poll();
          if(con == null)
               con = conexao.getConnection();
           
           else if(con.isClosed()){
               this.getConnection();
           }
           conexoesUtilizadas.put(con.toString(), con);
        }
       } catch(SQLException e){
            System.out.println("Problemas com o Pool");
            e.printStackTrace();
        }           
        return con;
    }
    public void liberarConexao(Connection con){
        conexoesLivres.add(con);
        conexoesUtilizadas.remove(con.toString());
}


}
